home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / diskread.zip / DISKREAD.BAS next >
BASIC Source File  |  1987-07-14  |  24KB  |  836 lines

  1. ' DISKREAD: A program to read absolute hard disk sectors and
  2. '           display the data.  It will NOT write to the drive.
  3. '
  4. ' Copyright 1986, 1987  Michael L. Brown
  5. '                       Nicolet Instrument Corp
  6. '                       5225-2 Verona Rd
  7. '                       PO Box 4288
  8. '                       Madison, WI  53711-0288
  9. '
  10. ' User is hereby granted permission to use said program.  User is not
  11. ' allowed to sell said program.  User may include said program with other
  12. ' programs, but may not charge extra for its inclusion.
  13. '
  14. ' Source of said program may also be distributed.  Please send any problems
  15. ' or code enhancements to the above address or electronically to:
  16. '                 The NICBUL BBS system  (608) 273-5037  6pm to 8am M-F
  17. '                                                        All day S-S  (CT)
  18. '              or via UUCP to ..!ihnp4!nicmad!brown
  19. '                             ..!seismo!uwvax!nicmad!brown
  20. '
  21. ' Version 1.2     November 4, 1986
  22. '         1.3     March 16, 1987
  23. '         1.4      6/24/87   Added main menu option 5: Copy complete disk
  24. '                            from one drive to another.
  25. '         1.5      7/14/87   Added copying multiple (sequential) sectors.
  26. '
  27.       VER$="Version 1.5"
  28.       DISPLAY% = 1
  29.       DRIVE%=128
  30.       CYL%=0
  31.       HEAD%=0
  32.       SECTOR%=1
  33.       ACYL% = 0
  34.       BCYL% = 0
  35.       AHEAD% = 0
  36.       BHEAD% = 0
  37.       ASECTOR% = 1
  38.       BSECTOR% = 1
  39.       GOSUB READPARAM
  40.       IF AH% = 0 THEN
  41.          GOSUB COMPAREDRV
  42.      GOTO 10
  43.       END IF
  44.       LOCATE 3,1,0
  45.       PRINT "Error while trying to read drive 0 parameters."
  46.       PRINT "The hard disk controller board returned an error of:";AH%
  47.       LOCATE 10,1,0
  48.       END
  49. '
  50. ' Clear the screen and set up the main menu
  51. '
  52. 10    CLS
  53.       HPOS% = 20
  54.       GOSUB BOX
  55. 20    LOCATE 5,34,0
  56.       PRINT CHR$(181);
  57.       COLOR 0,7
  58.       PRINT " MAIN MENU ";
  59.       COLOR 7,0
  60.       PRINT CHR$(198);
  61. 30    LOCATE 6,22,0
  62.       PRINT "DISKREAD"
  63.       LOCATE 6,58-LEN(VER$),0
  64.       PRINT VER$
  65. 40    LOCATE 8,22,0
  66.       PRINT "F1 - Select Drive Parameters"
  67.       LOCATE 9,22,0
  68.       PRINT "F2 - Display Disk Partition Table"
  69.       LOCATE 10,22,0
  70.       PRINT "F3 - Read Drive Data"
  71.       LOCATE 11,22,0
  72.       PRINT "F4 - Copy Disk Sector"
  73.       IF DRIVESEQUAL% THEN
  74.          LOCATE 12,22,0
  75.          PRINT "F5 - Copy Entire Disk"
  76.       END IF
  77.       LOCATE 14,22,0
  78.       PRINT "ESC- Return To DOS"
  79.       GOSUB INFO
  80. 50    IF DRIVESEQUAL% THEN
  81.          MAXKEY% = 5
  82.          MAXFUNC% = 5
  83.       ELSE
  84.          MAXKEY% = 4
  85.          MAXFUNC% = 4
  86.       END IF
  87.       GOSUB READKEY
  88.       IF KEYVAL% = 27 THEN CLS :_
  89.          END
  90.       ON KEYVAL% GOTO 10000, _   'Select Drive
  91.                       20000, _   'Display Partition Table
  92.                       30000, _   'Read Drive Data
  93.                       40000, _   'Copy Disk Sector
  94.                       50000      'Copy Entire Disk
  95.       GOTO 50
  96. '
  97. 'Select the parameters
  98. '
  99. 10000 CLS
  100.       HPOS% = 20
  101.       GOSUB BOX
  102.       LOCATE 5,32,0
  103.       PRINT CHR$(181);
  104.       COLOR 0,7
  105.       PRINT " SELECT DRIVE ";
  106.       COLOR 7,0
  107.       PRINT CHR$(198)
  108. 10010 LOCATE 7,22,0
  109.       PRINT "F1  - Select First Hard Disk"
  110.       LOCATE 8,22,0
  111.       PRINT "F2  - Select Second Hard Disk"
  112.       LOCATE 9,22,0
  113.       PRINT "F3  - Select Disk Cylinder"
  114.       LOCATE 10,22,0
  115.       PRINT "F4  - Select Disk Head"
  116.       LOCATE 11,22,0
  117.       PRINT "F5  - Select Disk Sector"
  118.       LOCATE 14,22,0
  119.       PRINT "ESC - Return To Main Menu"
  120. 10020 MAXKEY% = 0
  121.       MAXFUNC% = 5
  122.       IF DRIVE% = 128 THEN _
  123.          ACYL% = CYL% :_
  124.          AHEAD% = HEAD% :_
  125.          ASECTOR% = SECTOR%
  126.       IF DRIVE% = 129 THEN _
  127.          BCYL% = CYL% :_
  128.          BHEAD% = HEAD% :_
  129.          BSECTOR% = SECTOR%
  130.       LOCATE 17,20,0
  131.       IF DRIVE% = 128 AND MAXDRV% = 2 THEN COLOR 15,0
  132.       PRINT "Drive: 0";"  Cylinder:";
  133.       PRINT USING "#####";ACYL%;
  134.       PRINT "  Head:";AHEAD%;" Sector:";
  135.       PRINT USING "###";ASECTOR%;
  136.       COLOR 7,0
  137.       IF MAXDRV% < 2 THEN 10030
  138.       IF DRIVE% = 129 THEN COLOR 15,0
  139.       LOCATE 18,20,0
  140.       PRINT "Drive: 1";"  Cylinder:";
  141.       PRINT USING "#####";BCYL%;
  142.       PRINT "  Head:";BHEAD%;" Sector:";
  143.       PRINT USING "###";BSECTOR%;
  144.       COLOR 7,0
  145. 10030 GOSUB INFO
  146.       GOSUB READKEY
  147.       IF KEYVAL% = 27 THEN 10
  148.       IF KEYVAL% < 3 AND MAXDRV% = 2 THEN DRIVE% = KEYVAL%-1+128 :_
  149.          GOSUB READPARAM :_
  150.          IF DRIVE% = 128 THEN _
  151.             CYL% = ACYL% :_
  152.             HEAD% = AHEAD% :_
  153.             SECTOR% = ASECTOR%
  154.          IF DRIVE% = 129 THEN _
  155.             CYL% = BCYL% :_
  156.             HEAD% = BHEAD% :_
  157.             SECTOR% = BSECTOR%
  158.       IF KEYVAL% = 3 THEN LOCATE 22,1,1 :_
  159.          INPUT;"Enter Cylinder number: ",TMP%
  160.       IF KEYVAL% = 4 THEN LOCATE 22,1,1 :_
  161.          INPUT;"Enter Head number: ",TMP%
  162.       IF KEYVAL% = 5 THEN LOCATE 22,1,1 :_
  163.          INPUT;"Enter Sector number: ",TMP%
  164.       IF KEYVAL% = 3 AND TMP% <= MAXCYL% THEN CYL% = TMP%
  165.       IF KEYVAL% = 4 AND TMP% <= MAXHEAD% THEN HEAD% = TMP%
  166.       IF KEYVAL% = 5 AND TMP% <= MAXSEC% AND TMP% > 0 THEN SECTOR% = TMP%
  167.       LOCATE 22,1,0
  168.       PRINT SPACE$(40)
  169.       GOTO 10020
  170. '
  171. ' Display the drive's partition table
  172. '
  173. 20000 CLS
  174.       VPOS% = 1
  175.       HPOS% = 1
  176.       WASDRIVE% = DRIVE%
  177.       DRIVE% = 128
  178. 20010 GOSUB FBOX
  179.       IF DRIVE% = 128 THEN LOCATE 1,29 :_
  180.          PRINT CHR$(181); :_
  181.          COLOR 0,7 :_
  182.          PRINT " PARTITION INFORMATION "; :_
  183.          COLOR 7,0 :_
  184.          PRINT CHR$(198);
  185.       LOCATE VPOS%+1,HPOS%+36
  186.       PRINT "DRIVE";DRIVE%-128
  187.       LOCATE VPOS%+2,HPOS%
  188.       PRINT CHR$(199);
  189.       FOR L = 1 TO 78
  190.           PRINT CHR$(196);
  191.       NEXT
  192.       PRINT CHR$(182);
  193.       GOSUB READPARAM
  194.       IF AH% = 0 THEN 20020
  195.       LOCATE VPOS%+9,HPOS%+22
  196.       PRINT "Error ";HEX$(AH%);" while reading drive parameters";
  197.       GOTO 20100
  198. 20020 CYL% = 0
  199.       HEAD% = 0
  200.       SECTOR% = 1
  201.       AH% = 2
  202.       GOSUB CALLINT
  203.       DEF SEG = ES%
  204.       IF PEEK(BX%+510) = &H55 AND PEEK(BX%+511) = &HAA THEN 20030
  205.       LOCATE VPOS%+9,HPOS%+27
  206.       PRINT "This disk is not partitioned"
  207.       GOTO 20100
  208. 20030 LOCATE VPOS%+3,HPOS%+2
  209.       PRINT "# SYS TYPE START   END   SIZE      BYTES";
  210.       PRINT "  REL. SEC. OFFSET    NUMBER SECTORS";
  211.       PART% = BX%+&H1BE
  212.       FOR VPOS% = VPOS%+5 TO VPOS%+8
  213.           BOOT% = PEEK(PART%)
  214.           BEGHEAD% = PEEK(PART%+1)
  215.           BEGSEC% = PEEK(PART%+2)
  216.           BEGCYL% = PEEK(PART%+3)+((BEGSEC% AND &HC0)*4)
  217.           BEGSEC% = BEGSEC% AND &H3F
  218.           SYSIND% = PEEK(PART%+4)
  219.           ENDHEAD% = PEEK(PART%+5)
  220.           ENDSEC% = PEEK(PART%+6)
  221.           ENDCYL% = PEEK(PART%+7)+((ENDSEC% AND &HC0)*4)
  222.           ENDSEC% = ENDSEC% AND &H3F
  223.           RELSEC# = PEEK(PART%+8)+(PEEK(PART%+9)*256#)+(PEEK(PART%+10)*65536#)
  224.           RELSEC# = RELSEC# +(PEEK(PART%+11)*16777216#)
  225.           NUMSEC# = PEEK(PART%+12)+(PEEK(PART%+13)*256#)+(PEEK(PART%+14)*65536#)
  226.           NUMSEC# = NUMSEC# +(PEEK(PART%+15)*16777216#)
  227.           LOCATE VPOS%,HPOS%+1
  228.           IF DRIVE% = 128 THEN PRINT VPOS%-5;
  229.           IF DRIVE% = 129 THEN PRINT VPOS%-17;
  230.           IF NUMSEC# = 0 THEN 20040
  231.           IF SYSIND% = &H01 OR SYSIND% = &H04 THEN PRINT "DOS "; _
  232.              ELSE PRINT "    ";
  233.           IF BOOT% = &H80 THEN PRINT "  A "; _
  234.              ELSE PRINT "    ";
  235.           PRINT USING "######";BEGCYL%;ENDCYL%;
  236.           PRINT USING "#######";ENDCYL%-BEGCYL%+1;
  237.           PRINT USING "###,###,###";NUMSEC# * 512;
  238.           PRINT USING "######,###,###,###";RELSEC#;NUMSEC#;
  239. 20040 PART% = PART%+16
  240.       NEXT
  241.       IF MAXDRV% < 2 THEN 20100
  242.       IF DRIVE% = 129 THEN 20100
  243.       DRIVE% = 129
  244.       VPOS% = 13
  245.       GOTO 20010
  246. 20100 IF INKEY$ = "" THEN 20100
  247.       DRIVE% = WASDRIVE%
  248.       GOTO 10
  249. '
  250. ' Read and display requested drive sector
  251. '
  252. 30000 CLS
  253.       LOCATE 2,1,0
  254.       PRINT CHR$(201);
  255.       FOR L = 1 TO 78
  256.           PRINT CHR$(205);
  257.       NEXT
  258.       PRINT CHR$(187);
  259.       FOR L = 3 TO 24
  260.           LOCATE L,80,0